/**
 * 高阶函数(形式上):如果一个**函数**的形参或者返回值也是**函数**
 * 1. 回调函数
 * 2. 闭包
 * 3. 函数柯里化
 */

/**
 * 回调函数：接收数据
 * @param {*} url 
 * @param {*} callback 
 */
function ajax(url, callback) {
  setTimeout(() => {
    console.log(url);
    callback({ res: [] })
  }, 2000)
}
// 调用
ajax('api', (res) => {
  console.log(res)
})


// 需求：写一个函数，调用后返回一个函数=》每次调用都会自加一
/**
 * 闭包：1. 内部定义的变量可以常驻内存 2. 避免全局变量污染
 */
let fn = () => {
  let count = 0;
  return function () {
    count++;
    console.log(count)
  }
}

  ; (function (w) {
    var ahk = 100;
    console.log(w)
  })(window)


/**
 * 函数柯里化：就是把一个多参函数变为单参函数，同时返回接收余下参数和结果的函数
 * 作用： 
 * 1. 延迟调用
 * 2. 参数复用
 */
// 普通函数
let fne = function (a, b, c) {
  return a + b + c
}

// 柯里化函数
let klh = function (a) {
  return function (b) {
    return function (c) {
      return a + b + c
    }
  }
}
console.log(klh(10)(6)(2));

let fn2 = klh(20)(20);
// ajax => 继续
// console.log(fn2(2)(8))
console.log(fn2(12))
console.log(fn2(2))